package be.groept.ace.cursusplanning.model;

import java.util.*;

import be.groept.ace.cursusplanning.persistency.IPersistentieController;
import be.groept.ace.cursusplanning.persistency.IPersistentieProvider;
import be.groept.ace.cursusplanning.persistency.Persisteerbaar;


/**
 * Klasse Lector
 * @author Kevin Brigitta
 */

public class Lector implements Comparable<Lector>, Persisteerbaar, IElementVanUurroosterOverzicht{

	private String lectorCode;
	private String lectorNaam;
	private int aantalGewensteUren;
	private Cursus cursusVoorkeur;
	private List<AangebodenCursus> opdrachtCursussen;
	
	private IPersistentieProvider pProvider;
	
	/**
	 * Maakt een nieuw object "Lector" aan 
	 * @param lectorcode
	 * @param lectornaam
	 * @param aantalgewensteUren
	 * @param cursusVoorkeur
	 * @throws IllegalArgumentException
	 */
	public Lector(String lectorcode, String lectornaam, Integer aantalgewensteUren, Cursus cursusVoorkeur) throws IllegalArgumentException {
		setLectorCode(lectorcode);
		setLectorNaam(lectornaam);
		setAantalGewensteUren(aantalgewensteUren);
		setCursusVoorkeur(cursusVoorkeur);
		opdrachtCursussen = new ArrayList<AangebodenCursus>();
	}

	/**
	 * Geeft de lectorcode terug
	 * @return lectorCode
	 */
	public String getLectorCode() {
		return lectorCode;
	}
	

	/**
	 * Stelt nieuwe waarde in voor lectorcode
	 * @throws IllegalArgumentException
	 */
	private void setLectorCode(String lectorCode) throws IllegalArgumentException {
		if(lectorCode == null || lectorCode.equals("")) throw new IllegalArgumentException("Lectorcode mag niet leeg zijn.");
		this.lectorCode = lectorCode;
	}
	

	/**
	 * Geeft lectornaam terug
	 * @return lectorNaam
	 */
	public String getLectorNaam() {
		return lectorNaam;
	}

	/**
	 * Stelt nieuwe waarde in voor lectornaam
	 * @param lectorNaam
	 * @throws IllegalArgumentException
	 */
	private void setLectorNaam(String lectorNaam) throws IllegalArgumentException {
		if(lectorNaam == null || lectorNaam.equals("")) throw new IllegalArgumentException("Lectornaam mag niet leeg zijn.");
		this.lectorNaam = lectorNaam;
	}

	/**
	 * Geeft het aantal gewenste uren terug
	 * @return aantalGewensteUren
	 */
	public int getAantalGewensteUren() {
		return aantalGewensteUren;
	}

	/**
	 * Stelt het aantal gewenste uren in
	 * @param aantalGewensteUren
	 */
	public void setAantalGewensteUren(int aantalGewensteUren) {
		if (aantalGewensteUren < 0) throw new IllegalArgumentException("Aantal gewenste uren mag niet minder dan 0 zijn.");
		this.aantalGewensteUren = aantalGewensteUren;
	}
	
	public Cursus getCursusVoorkeur(){
		return this.cursusVoorkeur;
	}
	
	public void setCursusVoorkeur(Cursus cursus) {
		if (cursus == null) throw new IllegalArgumentException("Cursusvoorkeur mag niet leeg zijn.");
		this.cursusVoorkeur = cursus;
	}

	public List<AangebodenCursus> getOpdrachtCursussen(){
		return this.opdrachtCursussen;
		
	}
	
	public boolean addOpdrachtCursus (AangebodenCursus aangebodenCursus){
		
		if (aangebodenCursus == null) return false;
		
		if (opdrachtCursussen.contains(aangebodenCursus)) return false;
		
		return opdrachtCursussen.add(aangebodenCursus);		
	}
	
	public void removeOpdrachtCursus (AangebodenCursus aangebodenCursus){
		opdrachtCursussen.remove(aangebodenCursus);
	}

	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((lectorCode == null) ? 0 : lectorCode.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Lector other = (Lector) obj;
		if (lectorCode == null) {
			if (other.lectorCode != null)
				return false;
		} else if (!lectorCode.equals(other.lectorCode))
			return false;
		return true;
	}
	@Override
	public int compareTo(Lector lector) {
		return getLectorCode().compareTo(lector.getLectorCode());
	}
	
	@Override
	public String toString() {
		return getLectorNaam();
	}

	@Override
	public Object[] getInfoToBeSaved(IPersistentieController pController) {
		return pProvider.getInfoToBeSaved(pController);

	}
	public IPersistentieProvider getPersistentieProvider(){
		return pProvider;
	}
	public void setPersistentieProvider(IPersistentieProvider provider){
		this.pProvider = provider;
	}

}
